package com.yufan.test.office;

import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;

import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
import java.util.ArrayList;

public class PPT2ImgUtil {

    public static String PROJECT_PAHT="";
    public static String ROOT_PATH="";
    public static String PREFIX_DIR_PATH="/src/main/java/com/yufan/test/office/tmpofficefile";

    //静态代码块在main函数之前执行
    static {
        //初始化PATH
        PROJECT_PAHT=System.getProperty("user.dir");
        ROOT_PATH=PROJECT_PAHT+PREFIX_DIR_PATH;
    }


    /*
    * file:ppt文件
    * saveDir:保存的根路径
    * filePrefix:序号前缀 默认slide
    *
    * 输出:所有转换后的png图片的存储地址
    *
    *
    * 可能缺陷:
    * 虽然HSLF尝试尽可能靠近PowerPoint渲染幻灯片，但由于以下原因，输出可能与PowerPoint有所不同：
    *   Java2D渲染字体与PowerPoint不同。字体字形的绘制方式总是存在一些差异
    *   HSLF使用java.awt.font.LineBreakMeasurer将文本分成行。PowerPoint可能以不同的方式进行。
    *   如果演示文稿中的字体不可用，则将使用JDK默认字体。
    *
    *目前的限制：
    *
    *某些类型的形状尚不支持（艺术字，复杂的自动形状）
    *只能使用Java渲染位图图像（PNG，JPEG，DIB）
    *
    *
    * */
    public static List<String> DO_CONVERT(File file,String SAVE_DIR,String PRIFIX_FILE){
        List<String> list = new ArrayList<>();
        try {
            FileInputStream in = new FileInputStream(file);
            HSLFSlideShow ppt = new HSLFSlideShow(in);
            in.close();
            Dimension pgsize = ppt.getPageSize();
            int idx = 1;
            for (HSLFSlide slide : ppt.getSlides()) {
                BufferedImage img = new BufferedImage(pgsize.width,pgsize.height,BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics = img.createGraphics();
                //清除绘图区域
                graphics.setPaint(Color.white);
                graphics.fill(new Rectangle2D.Float(0,0,pgsize.width,pgsize.height));
                //渲染
                slide.draw(graphics);
                //保存输出
                String saveTmp=SAVE_DIR+"/"+PRIFIX_FILE+idx+".png";
                list.add(saveTmp);

                FileOutputStream out = new FileOutputStream(saveTmp);
                javax.imageio.ImageIO.write(img,"png",out);
                out.close();
                idx++;
            }

            return  list;
        } catch (Exception e) {
            e.printStackTrace();
            return list;
        }
    }







    //主函数
    public static void main(String[] args) throws  Exception{

         File file =new File(ROOT_PATH+"/"+"test2003.ppt");
         System.out.println(file.length());

         HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl(ROOT_PATH+"/"+"test2003.ppt"));
         //ppt每一页大小
         Dimension pageSize = ppt.getPageSize();
         //ppt所有的页
         List<HSLFSlide> slides = ppt.getSlides();
         System.out.println(pageSize);
         System.out.println(slides.size());

         //转换PPT到图片
         List<String> strings = DO_CONVERT(file, ROOT_PATH, "slide-");
         for (String string : strings) {
             System.out.println(string);
         }
    }
}
